package com.chenchao.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * @encoding : UTF-8
 * @Time : 2020/11/21 20:30
 * @Author : Chen Chao
 * @File : javaSE.com.chenchao.javareflection.Test03.java
 * @Software : IntelliJ IDEA
 * @since : 1.8
 * 获取类中的方法
 */
public class Test03 {
    public static void main(String[] args) throws Exception {
        //获取类的字节码对象
        Class c=Class.forName("com.chenchao.reflection.Fish");
        //获取类的构造函数
        Constructor constructor = c.getConstructor(String.class);
        //创建类对象
        Fish fish =(Fish) constructor.newInstance("小丑鱼");

        //获取成员方法
            //获取公共无参方法,getName()打印方法名
        Method grow = c.getMethod("grow");
        System.out.println(grow.getName());
            //获取公共有参方法
        Method grow1 = c.getMethod("grow", int.class);
        System.out.println(grow1);
            //获取共有静态方法
        Method show = c.getMethod("show");
            //获取所有公共方法
        System.out.println("======");
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("============");
            //获取私有方法
        Method secret = c.getDeclaredMethod("secret");
        System.out.println(secret);

        //执行成员方法
            //执行共有方法
        grow.invoke(fish);
        grow1.invoke(fish,1);
            //执行静态方法，用字节码对象或者实例对象都可以
        show.invoke(fish);
        show.invoke(c);

            //执行私有方法，需要暴力破解
        secret.setAccessible(true);
            //true为暴力破解
        String s = (String)secret.invoke(fish);
        System.out.println(s);

        System.out.println("========获取本类的所有方法===========");
        Method[] declaredMethods = c.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("========获取包括父类的所有public方法============");
        Method[] methods1 = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
    }
}
